package com.bawei.dongyoufa_common.utils;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.time.Instant;
import java.time.LocalDateTime;
import java.time.Month;
import java.time.ZoneId;
import java.util.Calendar;
import java.util.Date;

/**
 * @author 作者 :dongyoufa
 * @version
 * @Date 创建时间：2020-11-17 9:28:38
 * @Description 类说明 : 时间处理工具类
 */
public class DateUtil {

	/**
	 * 
	 * @Title: getAge
	 * @Description 方法的作用 :根据生日计算年龄
	 * @param 参数 :@param birthday
	 * @param 参数 :@return
	 * @return 返回类型 :int
	 * @throws
	 */
	public static int getAge(Date birthday) {
		System.out.println("1234567");
		// 1.获取系统的年月日
		Calendar c = Calendar.getInstance();// 用系统时间初始化日历类
		int now_year = c.get(Calendar.YEAR);// 获取系统的年
		int now_month = c.get(Calendar.MONTH);// 获取系统的月
		int now_day = c.get(Calendar.DAY_OF_MONTH);// 获取系统的日
		// 2获取出生日期的年月日
		c.setTime(birthday);// 修个日历类的具体时间
		int b_year = c.get(Calendar.YEAR);// 获取生日的年
		int b_month = c.get(Calendar.MONTH);// 获取生日的月
		int b_day = c.get(Calendar.DAY_OF_MONTH);// 获取生日的哪一天
		int age = now_year - b_year;// 年龄
		// 还没有到生日月份
		if (now_month < b_month) {
			// 让年龄减小1
			return age--;
		}
		if (now_month == b_month && now_day < b_day) {
			return age--;
		}
		return age;
	}

	/**
	 * 
	 * @Title: getBirthAge
	 * @Description 方法的作用 : TODO
	 * @param 参数 :@param birthday
	 * @param 参数 :@return
	 * @return 返回类型 :int
	 * @throws
	 */
	public static int getBirthAge(Date birthday) {
		
	
		// 1.获取系统的年月日
		LocalDateTime now = LocalDateTime.now();
		int year = now.getYear();
		Month month = now.getMonth();
		int dayOfMonth = now.getDayOfMonth();
		// 2、出生日期的年月日类型转换
		Instant instant = birthday.toInstant();
		ZoneId zoneId = ZoneId.systemDefault();
		LocalDateTime of = instant.atZone(zoneId).toLocalDateTime(); // 将date类型转换成localdatetime类型
		int year1 = of.getYear();
		Month month1 = of.getMonth();
		int dayOfMonth1 = of.getDayOfMonth();

		int age = year - year1;// 年龄
		
		int compareTo = now.compareTo(of);
		// 还没有到生日月份
		if (month.compareTo(month1) < 0) {
			// 让年龄减小1
			return age--;
		}
		if (month.compareTo(month1) == 0 && dayOfMonth < dayOfMonth1) {
			// 让年龄减小1
			return age--;
		}
		return age;
	}

	/**
	 * 
	 * @Title: getStringFromDate
	 * @Description 方法的作用 : 将Date类型的日期转换成String类型
	 * @param 参数 :@param date
	 * @param 参数 :@return
	 * @return 返回类型 :String
	 * @throws
	 */
	public static String getStringFromDate(Date date) {

		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
		return sdf.format(date);
	}

	/**
	 * 
	 * @Title: getStringFromDate
	 * @Description 方法的作用 : TODO
	 * @param 参数 :@param date
	 * @param 参数 :@param pattern
	 * @param 参数 :@return
	 * @return 返回类型 :String
	 * @throws
	 */
	public static String getStringFromDate(Date date, String pattern) {

		SimpleDateFormat sdf = new SimpleDateFormat(pattern);

		return sdf.format(date);
	}

	/**
	 * 
	 * @Title: getDateFromString
	 * @Description 方法的作用 : 将Date类型的日期转换成String类型
	 * @param 参数 :@param date
	 * @param 参数 :@return
	 * @param 参数 :@throws ParseException
	 * @return 返回类型 :Date
	 * @throws
	 */
	public static Date getDateFromString(String date) throws ParseException {

		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");

		return sdf.parse(date);
	}

	/**
	 * 
	 * @Title: getMonth
	 * @Description 方法的作用 : 计算传入日期到现在共有多少月
	 * @param 参数 :@param date
	 * @param 参数 :@return
	 * @return 返回类型 :int
	 * @throws
	 */
	public static int getMonth(Date date) {

		// 1、当前的年月
		Calendar c = Calendar.getInstance();//
		// 当前年
		int now_year = c.get(Calendar.YEAR);
		// 当前月2
		int now_month = c.get(Calendar.MONTH);

		// 2、传入的年月
		Calendar c2 = Calendar.getInstance();
		c2.setTime(date);
		// 传入的年
		int param_year = c2.get(Calendar.YEAR);
		// 传入的月
		int param_month = c2.get(Calendar.MONTH);
		int month = (now_year - param_year) * 12 + (now_month - param_month);
		return month;
	}

	/**
	 * 
	 * @Title: getFirstDayOfMonth
	 * @Description 方法的作用 : 给定时间对象，获取该时间的月初1日0时0分0秒0毫秒
	 * @param 参数 :@param src
	 * @param 参数 :@return
	 * @return 返回类型 :Date
	 * @throws
	 */
	public static Date getFirstDayOfMonth(Date src) {
		// 获取系统时间
		Calendar c = Calendar.getInstance();
		// 用传入的日期初始化日历类
		c.setTime(src);
		// 方式1
		c.set(c.get(Calendar.YEAR), c.get(Calendar.MONTH), 1, 0, 0, 0);
		// 方式2
		// c.set(Calendar.DAY_OF_MONTH, 1);//设置日为月份第一天
		// c.set(Calendar.HOUR_OF_DAY, 0);//设置小时
		// c.set(Calendar.MINUTE, 0);//设置分钟
		// c.set(Calendar.SECOND, 0);//设置秒
		return c.getTime();
	}

	/**
	 * 
	 * @Title: getLastDayOfMonth
	 * @Description 方法的作用 : 给定时间对象，获取该时间的月末最后一天的23时23分59秒999毫秒
	 * @param 参数 :@param src
	 * @param 参数 :@return
	 * @return 返回类型 :Date
	 * @throws
	 */
	public static Date getLastDayOfMonth(Date src) {
		// 思路： 让当前日期的月份加1个月，然后获取月初，再减去1秒
		// 1.获取系统日期
		Calendar c = Calendar.getInstance();
		// 2.用传入的日期初始化日历类
		c.setTime(src);
		// 3让当前日期的月份加1个月
		c.add(Calendar.MONTH, 1);
		// 4.然后获取月初
		c.set(c.get(Calendar.YEAR), c.get(Calendar.MONTH), 1, 0, 0, 0);
		// 5.再减去1秒
		c.add(Calendar.SECOND, -1);
		return c.getTime();

	}

	/**
	 * 
	 * @Title: offsetDate
	 * @Description 方法的作用 : 获取当前日期指定天数之前或之后的日期，如果参数为负数，则往前回滚。
	 * @param 参数 :@param days
	 * @param 参数 :@return
	 * @return 返回类型 :Date
	 * @throws
	 */
	public static Date offsetDate(int days) {
		Calendar c = Calendar.getInstance();
		c.add(Calendar.DAY_OF_MONTH, days);
		return c.getTime();
	}

	/**
	 * 
	 * @Title: getCurrentSeason
	 * @Description 方法的作用 : 获取当前季节，如春季、夏季、秋季、冬季。
	 * @param 参数 :@return
	 * @return 返回类型 :Season
	 * @throws
	 */
	public static Season getCurrentSeason() {
		Calendar c = Calendar.getInstance();
		// 获取当前系统时间的月份
		int month = c.get(Calendar.MONTH) + 1;
		// 春：3-4-5；夏：6-7-8；秋：9-10-11；冬： 12-1-2
		if (month < 9 && month > 2) {
			if (month < 6) {
				return Season.春;
			}
			return Season.夏;
		} else {
			if (month >= 9 && month <= 11)
				return Season.秋;
			return Season.冬;
		}

	}

	/**
	 * 
	 * @Title: getDisplayTime
	 * @Description 方法的作用 : 获取人性化时间，例如5分钟之内则显示“刚刚”，其它显示16分钟前、2小时前、3天前、4月前、5年前等
	 * @param 参数 :@param date
	 * @param 参数 :@return
	 * @return 返回类型 :String
	 * @throws
	 */
	public static String getDisplayTime(Date date) {
		// 获取传入日期的毫米值 ;从1970-1-1 到date 的毫米值
		long t1 = date.getTime();
		// 当前系统日期的毫米值;即 从1970-1-1 到现在的毫米值
		long t2 = new Date().getTime();
		// 获取两个时间的差值
		long t = t2 - t1;
		// 分钟
		long minute = t / 1000 / 60;
		if (t2 < t1)
			return "未来时间";
		if (minute / 60 / 24 / 30 / 12 >= 1)
			return minute / 60 / 24 / 30 / 12 + "年前";
		else if (minute / 60 / 24 / 30 >= 1)
			return minute / 60 / 24 / 30 + "月前";
		else if (minute / 60 / 24 >= 1)
			return minute / 60 / 24 + "天前";
		else if (minute / 60 >= 1)
			return minute / 60 + "小时前";
		else if (minute > 5)//
			return minute + "分钟前";
		else
			return "刚刚";
	}
}
